package com.study.homework;

/**
 *  String.intern() 返回引用的测试
 *  在 JDK6 及以前的 JDK 中:intern() 方法会把首次遇到的字符串实例 **复制** 到永久代中, 然后返回永久代中的实例.
 *  而对于 JDK7 以及之上的JDK:当遇到第一次出现的字符串时, intern() **不再复制实例**, 而是在常量池中记录首次出现的实例的引用, 并且 intern() 返回的是此实例引用.
 * @author andys
 *
 */
public class RuntimeConstantPoolOOM {
	
	public static void main(String[] args) {
		String str1 = new StringBuilder("a").append("b").toString();
		System.out.println(str1.intern() == str1);
		
//		JDK6 和 JDK7 都是打印的 false, 其原因是 "java" 字符串常量比较特殊, 它是固定存在字符串常量池中的, 
//		因此 "str1.intern()" 返回的就是字符串常量池中的对象的引用, 和堆上的 str2 就自然是不相等
		String str2 = new StringBuilder("ja").append("va").toString();
		System.out.println(str2.intern());
		System.out.println(str2.intern() == str2);
		
		String str3 = new StringBuilder("a").append("b").toString();
		System.out.println(str3.intern() == str3);
		
	}
}
